/***********************************************************************
* 描述:		该类为访问HTTP接口的封装类，其主要是调用了cURL库
 * File:    httpclient.h
 * Author:  liquan@mozihealthcare.cn
 * Date:    2025-10-18
 * Update:
 **********************************************************************/

#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H

#include <iostream>
#include <QString>

namespace cxi_ftc
{
	class HttpClient {
	public:
		/**
		 * 构造函数
		 * @param url 请求HTTP地址
		 */
		explicit HttpClient(QString url);
		// 析构函数
		~HttpClient();
		// 禁用拷贝构造和赋值操作
		HttpClient(const HttpClient&) = delete;
		HttpClient& operator=(const HttpClient&) = delete;
		// 移动构造和移动赋值
		HttpClient(HttpClient&&) = default;
		HttpClient& operator=(HttpClient&&) = default;

		/**
		 * 获取HTTP请求状态码
		 * @return 状态码
		 */
		long httpCode() const;
		/**
		 * 获取错误信息
		 * @return 错误信息
		 */
		QString error() const;
		/**
		 * 发送POST请求
		 * @param requestData 请求发送的数据
		 * @param responseData 请求返回的数据
		 * @return 请求状态，true-成功，false-失败
		 */
		bool post(const std::string& requestData, std::string& responseData);
		/**
		 * 下载文件
		 * @param saveFileFullPath 本地保存路径
		 * @return 
		 */
		bool downloadFile(const QString& saveFileFullPath);

	private:
		QString m_url;                           // 请求HTTP地址
		long m_httpCode;                             // HTTP状态码
		QString m_error;                         // 错误信息
		/**
		 * @brief curl写数据回调函数
		 * @param ptr 数据指针
		 * @param size 每个数据单元大小
		 * @param nMemb 数据单元数量
		 * @param userData 用户数据指针
		 * @return 实际处理的数据大小
		 */
		static size_t writeCallback(void* ptr, size_t size, size_t nMemb, std::string* userData);
		// 回调函数: 写入下载的文件数据
		static size_t writeFileCallback(const void* contents, size_t size, size_t nmemb, void* userp);
		// 回调函数: 进度通知
		static int progressCallback(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow);
	};
}


#endif //HTTPCLIENT_H
